<?php

defined('BASEPATH') or die('forbidden');

/**
 * URI类
 * @author  Karson
 * @name    uri.php
 * @since   2011-03-19 11:25:32
 */
class uri {

    var $path = null;

    function __construct() {
        if (!empty($_SERVER['PATH_INFO'])) {
            $this->path = explode('/', $_SERVER['PATH_INFO']);
            $this->path = array_slice($this->path, 1);
        }
    }

    /**
     * 获取元素URL指定分段位置值
     * @param int $index 分段的位置，位置从0算起，控制器为0，方法为1，依次类推
     * @param string $default 当未获取到指定位置值的时候的默认值，默认为空
     * @param string $slash 前后加上/，默认为空，可选值first(),final
     * @return string 成功返回指定位置值，失败返回default的值
     */
    function segment($index, $default = '', $slash = '') {
        $index = $index <= 0 ? 0 : $index;
        $this->path = array_slice(explode('/', get_instance()->path_info), 1);
        if (!empty($this->path[$index]) && isset($this->path[$index]))
            if ($slash == 'first' || $slash == 'forward' || $slash == 'before') {
                return '/' . $this->path[$index];
            } else if ($slash == 'final' || $slash == 'behind' || $slash == 'after') {
                return $this->path[$index] . '/';
            } else {
                return $this->path[$index];
            }
        else
            return $default;
    }

    /**
     * 从指定位置开始获取参数
     * @param int $index 指定位置的分段位置，位置从0算起
     * @return array 成功的数组
     */
    function uri_to_assoc($index) {
        $index = $index <= 0 ? 1 : $index + 1;
        $this->path = array_slice(explode('/', get_instance()->path_info), 1);
        $assoc = array();
        for ($x = count($this->path), $y = $index - 1; $y < $x; $y += 2) {
            $assoc_idx = $this->path[$y];
            $assoc[$assoc_idx] = isset($this->path[$y + 1]) ? $this->path[$y + 1] : null;
        }
        return $assoc;
    }

    /**
     * 获取URL参数并返回数组
     * @param int $index 指定位置的分段位置，位置从0算起，默认为0
     * @param int $length 获取数组长度，默认为空
     * @return array 获取成功后的数组值
     */
    function uri_to_array($index = 0, $length = null) {
        $index = $index <= 0 ? 0 : $index;
        $this->path = array_slice(explode('/', get_instance()->path_info), 1);
        return (is_array($this->path)) ? array_slice($this->path, $index, $length) : false;
    }

}
